<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <title>01_class</title>
</head>

<body>
  <script type="text/javascript">
    //创建一个Person类
    class Person {
      //构造器方法
      constructor(name, age) {
        //构造器中的this是类的实例对象
        this.name = name
        this.age = age
      }

      //一般方法
      speak() {
        //speak放在了类的原型对象上，供实例使用
        //通过Person实例调用speak时，speak中的this就是Person实例
        console.log(`我叫${this.name},我年龄是${this.age}`);
      }
    }

    //实例一个Person对象
    const p1 = new Person('tom', 18)
    const p2 = new Person('jerry', 20)

    console.log(p1);
    console.log(p2);
    p1.speak()
    p2.speak()

    //创建一个Student类，继承于Person类
    class Student extends Person {
      constructor(name, age, grade) {
        // 调用父类的构造函数，传入name和age参数
        super(name, age)
        this.grade = grade
      }

      //重写从父类继承过来的方法
      speak() {

        console.log(`我叫${this.name},我年龄是${this.age},我读的是${this.grade}`);
      }

      study() {
        //study放在了类的原型对象上，供实例使用
        //通过Student实例调用study时，study中的this就是Student实例
        console.log('我很努力学习')
      }
    }

    const s1 = new Student('小张', 15, '高一')
    console.log(s1);
    s1.speak()
    s1.study()


    class Car {
      constructor(name, price) {
        this.name = name
        this.price = price
        //this.wheel = 4
      }
      //类中可以直接写赋值语句，如下代码的含义是：给Car的实例对象添加一个属性，名为a，值为1
      a = 1
      wheel = 4
    }
    const c1 = new Car('benchi',5555)
    const c2 = new Car('baoma',5566)
    console.log(c1);

    /*
    总结：  
      1.类中的构造器不是必须写的，要对实例进行一些初始化的操作，如添加制定属性时才写
      2.如果A类继承B类，且A类中写了构造器，那么A类构造器中的super是必须要调用的
      3.类中定义的方法，都是放在了类的原型对象上，供实例去使用
    */
  </script>
</body>

</html>